package gcp.gui;

import gcp.Amigo;
import gcp.enums.Sexo;
import gcp.principal.FrameGCP;
import gcp.principal.GCP;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;

/**
 * FrameAmigo<br>
 * Frame responsavel pela criacao/edicao de amigos.
 * @author Hildegard Furtado
 */
public class FrameAmigo extends JInternalFrame {
    private static final long serialVersionUID = 1L;
    private FrameGCP frameGcp;
    private GCP gcp;
    private Container tela;

    private JLabel textoNome, textoSobrenome, textoEndereco, textoEmail,
            textoTelefone, textoCelular, textoSexo, textoDataDeNascimento;
    private JTextField campoDataDeNascimento;
    private JTextField campoNome, campoSobrenome, campoEndereco, campoEmail;
    private JFormattedTextField campoCelular, campoTelefone;
    private JComboBox comboSexo;
    private JButton botaoOk, botaoSair, botaoLimpar;
    private Amigo amigo;

    /**
     * Construtor para o FrameAmigo.
     * @param frameGcp Frame principal do GCP.
     * @param amigo Amigo a ser editado, ou null para criacao de um novo amigo.
     */
    public FrameAmigo(FrameGCP frameGcp, Amigo amigo) {
        super("Cadastros Amigo");
        this.frameGcp = frameGcp;
        this.amigo = amigo;
        gcp = frameGcp.getGcp();
        inicializar();
        posicoes();
        acoes();
        constroiTela();
        carregar();
    }

    /**
     * Incializacao dos componentes para o FrameAmigo.
     */
    private void inicializar() {
        setSize(600, 500);
        setClosable(true);
        tela = getContentPane();
        tela.setLayout(null);

        textoNome = new JLabel("Nome: ");
        textoSobrenome = new JLabel("Sobrenome: ");
        textoEndereco = new JLabel("Endereço: ");
        textoTelefone = new JLabel("Telefone: ");
        textoCelular = new JLabel("Celular: ");
        textoSexo = new JLabel("Sexo: ");
        textoEmail = new JLabel("E-mail: ");
        textoDataDeNascimento = new JLabel("Data de nascimento: ");

        campoNome = new JTextField();
        campoSobrenome = new JTextField();
        campoEndereco = new JTextField();
        campoEmail = new JTextField();

        campoTelefone = criarCampoTelefone();
        campoCelular = criarCampoTelefone();

        botaoOk = new JButton("Ok");
        botaoLimpar = new JButton("Limpar");
        botaoSair = new JButton("sair");

        comboSexo = new JComboBox();

        comboSexo.addItem(Sexo.SELECIONAR);
        comboSexo.addItem(Sexo.MASCULINO);
        comboSexo.addItem(Sexo.FEMININO);

        campoDataDeNascimento = criarCampoData();
    }

    /**
     * Cria um campo com a mascara para manipulacao de datas no FrameAmigo.
     */
    private JTextField criarCampoData() {
        try {
            MaskFormatter mascaraData = new MaskFormatter("**/**/****");
            mascaraData.setPlaceholderCharacter('_');
            mascaraData.setValidCharacters("0123456789 _");
            JFormattedTextField retorno = new JFormattedTextField(mascaraData);
            return retorno;
        } catch (ParseException e) {
            JFormattedTextField retorno = new JFormattedTextField();
            return retorno;
        }
    }

    /**
     * fornece formatacao para preenchimento do telefone do Usuario no
     * FrameAmigo.
     * @return retorno O formato de preenchuimento adequado para o FrameAmigo.
     */
    public JFormattedTextField criarCampoTelefone() {
        JFormattedTextField retorno = null;
        try {
            MaskFormatter mascara = new MaskFormatter("(**) ****-****");
            mascara.setValidCharacters("0123456789 ");
            mascara.setPlaceholderCharacter(' ');
            retorno = new JFormattedTextField(mascara);
        } catch (ParseException e) {}
        return retorno;
    }

    /**
     * Define as posicoes dos componentes no FrameAmigo.
     */
    private void posicoes() {
        textoNome.setBounds(10, 10, 40, 27);
        campoNome.setBounds(50, 10, 300, 27);
        textoSobrenome.setBounds(10, 40, 80, 27);
        campoSobrenome.setBounds(81, 40, 300, 27);
        textoDataDeNascimento.setBounds(10, 70, 120, 27);
        campoDataDeNascimento.setBounds(128, 70, 75, 27);
        textoSexo.setBounds(348, 70, 40, 27);
        comboSexo.setBounds(393, 70, 120, 27);
        textoTelefone.setBounds(10, 100, 60, 27);
        campoTelefone.setBounds(63, 100, 100, 27);
        textoCelular.setBounds(263, 100, 50, 27);
        campoCelular.setBounds(308, 100, 100, 27);
        textoEndereco.setBounds(10, 130, 60, 27);
        campoEndereco.setBounds(68, 130, 500, 27);
        textoEmail.setBounds(10, 160, 50, 27);
        campoEmail.setBounds(50, 160, 300, 27);
        botaoOk.setBounds(440, 300, 100, 27);
        botaoLimpar.setBounds(440, 340, 100, 27);
        botaoSair.setBounds(440, 380, 100, 27);
    }

    /**
     * Define as acoes dos botoes do FrameAmigo.
     */
    private void acoes() {
        // Ao apertar o botao ok confirmar o cadastro do Amigo
        botaoOk.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                cadastrar();
            }
        });

        // Ao apertar o botao limpar limpa os campos preenchidos
        botaoLimpar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                campoNome.setText(null);
                campoSobrenome.setText(null);
                campoEndereco.setText(null);
                campoEmail.setText(null);
                campoTelefone.setText(null);
                campoCelular.setText(null);
                campoDataDeNascimento.setText(null);
                comboSexo.setSelectedItem("Selecionar");
            }
        });
        // fecha a janela ao apertar o botao sair
        botaoSair.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
    }

    /**
     * Carrega os dados do amigo em tela.
     */
    private void carregar() {
        if (amigo != null) {
            campoNome.setText(amigo.getNome());
            campoSobrenome.setText(amigo.getSobrenome());
            campoCelular.setText(amigo.getCelular());
            campoTelefone.setText(amigo.getTelefone());
            campoEmail.setText(amigo.getEmail());
            campoEndereco.setText(amigo.getEndereco());
            campoDataDeNascimento.setText(new SimpleDateFormat("dd/MM/yyyy")
                    .format(amigo.getDataNascimento()));
            comboSexo.setSelectedItem(amigo.getSexo());

        }
    }

    /**
     * Cria um Amigo e Adiciona as informacoes obtidas ao cadastro do Amigo, por
     * fim adicona-o a conta do Usuario.
     */
    @SuppressWarnings("deprecation")
    protected void cadastrar() {
        boolean novo = amigo == null;
        String nome = campoNome.getText();
        String sobrenome = campoSobrenome.getText();
        String celular = campoCelular.getText();
        String telefone = campoTelefone.getText();
        String endereco = campoEndereco.getText();
        String email = campoEmail.getText();
        String dataNascimento = campoDataDeNascimento.getText();

        if (novo)
            amigo = new Amigo();
        try {
            Date date = new SimpleDateFormat("dd/MM/yyyy")
                    .parse(dataNascimento);
            amigo.setDataNascimento(date);
            if (date.getDay() <= 0 || date.getDay() > 31 || date.getMonth() < 0
                    || date.getMonth() > 11 || date.getYear()+1900 < 1900
                    || date.getYear()+1900 > 2100) {
                frameGcp.exibirMensagem("A data de nascimento não é válida.");
                return;
            }
        } catch (ParseException e) {
            frameGcp.exibirMensagem("A data de nascimento não é válida.");
            return;
        }

        try {

            if (nome.isEmpty()) {
                frameGcp.exibirMensagem("Campo nome deve ser preenchido");
                return;
            }
            amigo.setNome(nome);
            if (sobrenome.isEmpty()) {
                frameGcp.exibirMensagem("Campo sobrenome deve ser preenchido");
                return;
            }
            amigo.setSobrenome(sobrenome);
            amigo.setEndereco(endereco);
            amigo.setEmail(email);
            amigo.setTelefone(telefone);
            amigo.setCelular(celular);
            amigo.setSexo((Sexo) comboSexo.getSelectedItem());
            if (novo)
                gcp.adicionaAmigo(frameGcp.getUsuarioLogado(), amigo);
            dispose();
        } catch (Exception e) {
            frameGcp.exibirMensagem(e.getMessage());
        }
    }

    /**
     * Adiciona os componentes em tela.
     */
    private void constroiTela() {
        tela.add(textoNome);
        tela.add(textoSobrenome);
        tela.add(textoEndereco);
        tela.add(textoEmail);
        tela.add(textoTelefone);
        tela.add(textoSexo);
        tela.add(textoCelular);
        tela.add(textoDataDeNascimento);

        tela.add(campoNome);
        tela.add(campoSobrenome);
        tela.add(campoEmail);
        tela.add(campoEndereco);
        tela.add(campoTelefone);
        tela.add(campoCelular);
        tela.add(campoDataDeNascimento);

        tela.add(botaoOk);
        tela.add(botaoLimpar);
        tela.add(botaoSair);

        tela.add(comboSexo);
    }
}